package cn.zhp.service.impl;

import cn.zhp.entity.SysLog;
import cn.zhp.mapper.SysLogMapper;
import cn.zhp.service.SysLogService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

@Service
/**
 * spring的事务管理器提供了三个管理策略
 * 1.事务类型 :
 * 只读事务-只能用于查询
 * 非只读事务-可以用于增删改查  默认   会需要数据库分配额外的资源 进行回滚的处理  如  保存原数据
 *
 * 2.TransactionDefinition定义了事务的隔离级别和传播行为
 * ISOLATION：事务隔离级别
 * ISOLATION_DEFAULT：使用数据库的隔离级别  当前mysql是可重复读
 *
 * 3.PROPAGATION  :事务传播行为        方法中的事务是否传递到其调用方法中
 *
 * PROPAGATION_REQUIRED = 0;  默认    当前方法必须要有事务   如果没有事务会创建事务
 * PROPAGATION_SUPPORTS = 1;           当前方法如果有事务则加入事务  如果没有事务则不创建事务
 * PROPAGATION_MANDATORY = 2;           当前方法必须要有事务   如果没有事务抛异常
 * PROPAGATION_REQUIRES_NEW = 3;        当前方法必须要有事务  如果有事务  也会新建一个事务
 * PROPAGATION_NOT_SUPPORTED = 4;
 * PROPAGATION_NEVER = 5;
 * PROPAGATION_NESTED = 6;
 *
 * rollbackFor:设置回滚异常类型
 * 默认只对非检查异常回顾
 */
@Transactional(readOnly = false,isolation = Isolation.DEFAULT)
public class SysLogServiceImpl extends BaseServiceImpl<SysLog> implements SysLogService {

    @Autowired
    SysLogMapper logMapper;

    @Override
    public PageInfo<SysLog> selectByCondition(Map<String, Object> params,int pageNum,int pageSize) {

        PageHelper.startPage(pageNum,pageSize);

        List<SysLog> sysLogs = logMapper.selectByCondition(params);
        PageInfo<SysLog> pageInfo = new PageInfo<>(sysLogs);//生成分页对象

        return pageInfo;
    }


    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor=Exception.class)//不管是否有事务，都另起一个事务
    public int insertSelective(SysLog sysLog) {
        return super.insertSelective(sysLog);
    }
}
